package com.example.doubledatasource.common;

import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.function.Function;

/**
 * 分页返回结果类
 *
 * @author example
 * @since 1.0.0
 */
@Data
@NoArgsConstructor
public class PageResult<T> extends Result<PageData<T>> {

    /**
     * 构造函数
     */
    public PageResult(Integer code, String message, PageData<T> data, Long timestamp) {
        this.setCode(code);
        this.setMessage(message);
        this.setData(data);
        this.setTimestamp(timestamp);
    }

    /**
     * 成功的分页响应
     */
    public static <T> PageResult<T> success(List<T> records, Long total, Integer page, Integer size) {
        PageData<T> pageData = new PageData<>(records, total, page, size);
        return new PageResult<>(SUCCESS_CODE, "查询成功", pageData, System.currentTimeMillis());
    }

    /**
     * 成功的分页响应
     */
    public static <T> PageResult<T> success(String message, List<T> records, Long total, Integer page, Integer size) {
        PageData<T> pageData = new PageData<>(records, total, page, size);
        return new PageResult<>(SUCCESS_CODE, message, pageData, System.currentTimeMillis());
    }

    /**
     * 成功的分页响应（使用PageData）
     */
    public static <T> PageResult<T> success(PageData<T> pageData) {
        return new PageResult<>(SUCCESS_CODE, "查询成功", pageData, System.currentTimeMillis());
    }

    /**
     * 成功的分页响应（从IPage创建）
     */
    public static <T> PageResult<T> success(IPage<T> page) {
        PageData<T> pageData = new PageData<>(
            page.getRecords(),
            page.getTotal(),
            (int) page.getCurrent(),
            (int) page.getSize()
        );
        return new PageResult<>(SUCCESS_CODE, "查询成功", pageData, System.currentTimeMillis());
    }

    /**
     * 成功的分页响应（从IPage创建，自定义消息）
     */
    public static <T> PageResult<T> success(String message, IPage<T> page) {
        PageData<T> pageData = new PageData<>(
            page.getRecords(),
            page.getTotal(),
            (int) page.getCurrent(),
            (int) page.getSize()
        );
        return new PageResult<>(SUCCESS_CODE, message, pageData, System.currentTimeMillis());
    }

    /**
     * 成功的分页响应（从IPage创建并转换数据类型）
     */
    public static <T, R> PageResult<R> success(IPage<T> page, Function<List<T>, List<R>> converter) {
        List<R> convertedRecords = converter.apply(page.getRecords());
        PageData<R> pageData = new PageData<>(
            convertedRecords,
            page.getTotal(),
            (int) page.getCurrent(),
            (int) page.getSize()
        );
        return new PageResult<>(SUCCESS_CODE, "查询成功", pageData, System.currentTimeMillis());
    }

    /**
     * 成功的分页响应（从IPage创建并转换数据类型，自定义消息）
     */
    public static <T, R> PageResult<R> success(String message, IPage<T> page, Function<List<T>, List<R>> converter) {
        List<R> convertedRecords = converter.apply(page.getRecords());
        PageData<R> pageData = new PageData<>(
            convertedRecords,
            page.getTotal(),
            (int) page.getCurrent(),
            (int) page.getSize()
        );
        return new PageResult<>(SUCCESS_CODE, message, pageData, System.currentTimeMillis());
    }



    // 便捷访问方法 - 直接访问分页数据
    public List<T> getRecords() {
        return getData() != null ? getData().getRecords() : null;
    }

    public Long getTotal() {
        return getData() != null ? getData().getTotal() : 0L;
    }

    public Integer getPage() {
        return getData() != null ? getData().getPage() : 1;
    }

    public Integer getSize() {
        return getData() != null ? getData().getSize() : 10;
    }
}

/**
 * 分页数据类
 */
@Data
@NoArgsConstructor
class PageData<T> {

    private List<T> records;        // 记录列表
    private Long total;             // 总记录数
    private Integer page;           // 当前页码
    private Integer size;           // 每页大小
    private Integer totalPages;     // 总页数
    private Boolean hasNext;        // 是否有下一页
    private Boolean hasPrevious;    // 是否有上一页

    /**
     * 构造函数 - 自动计算分页信息
     */
    public PageData(List<T> records, Long total, Integer page, Integer size) {
        this.records = records;
        this.total = total;
        this.page = page;
        this.size = size;

        // 计算总页数
        this.totalPages = size > 0 ? (int) Math.ceil((double) total / size) : 0;

        // 计算分页状态
        this.hasNext = page < totalPages;
        this.hasPrevious = page > 1;
    }
}
